package com.robotic.sensor.config;

import lombok.extern.slf4j.Slf4j;
import org.springframework.expression.Expression;
import org.springframework.expression.ExpressionParser;
import org.springframework.expression.spel.standard.SpelExpressionParser;
import org.springframework.expression.spel.support.StandardEvaluationContext;
import org.springframework.stereotype.Service;

@Service
@Slf4j
public class DynamicRuleValidator {

    private static final ExpressionParser parser = new SpelExpressionParser();

    /**
     * 验证给定的值是否满足动态规则。
     *
     * @param rule        从数据库中获取的规则字符串 (例如 "a > 50 && a < 100")
     * @param variableName 规则中使用的变量名 (例如 "a")
     * @param value       要代入规则中进行计算的实际值 (例如温度值 75.5)
     * @return 如果满足规则则返回 true，否则返回 false
     */
    public boolean validate(String rule, String variableName, Object value) {
        try {
            // 1. 解析表达式字符串
            Expression expression = parser.parseExpression(rule.replace("t", "#t"));

            // 2. 创建一个评估上下文
            StandardEvaluationContext context = new StandardEvaluationContext();

            // 3. 在上下文中设置变量的值 (将变量名 "a" 与实际的温度值关联起来)
            context.setVariable(variableName, value);

            // 4. 执行表达式并获取布尔结果
            Boolean result = expression.getValue(context, Boolean.class);

            // 防止结果为 null
            return result != null && result;

        } catch (Exception e) {
            // 在实际项目中，这里应该有更详细的日志记录
            log.error("规则 '{}' 执行失败: {}", rule, e.getMessage());
            return false; // 规则解析或执行失败，按不符合标准处理
        }
    }
}
